package aedustuff;

import java.util.ArrayList;
import java.util.Collections;

/**
 * Diese Klasse initialisiert ein Kartendeck. Dazu werden von jeder Farbe 9
 * Karten zum Deck hinzugefügt. Danach wird das Kartendeck gemischelt, und jeder
 * Karte noch die Stapelposition zugeteilt (Erste Karte zuoberst auf dem Stapel,
 * ist Nr1). So kann während dem Spielverlauf erkannt werden, wieviele Karten
 * gespielt wurden, falls dies nicht von der Spiellogik übernommen wird.
 *
 * @author Adrian Hostettler
 */
public class MainCardDeck implements ICardDeck {

    private ArrayList<Card> cardDeck;

    /**
     * CardDeck wird im Konstruktor initialisiert.
     */
    public MainCardDeck() {
        cardDeck = new ArrayList<Card>();
        initCards();
    }

    /**
     * Diese Methode fügt dem Kartendeck 9 Karten der mitgegebenen Farbe hinzu.
     *
     * @param cardColor
     */
    private void add9CardsOfSpecificColor(CardColor cardColor) {
        for (int i = 0; i < 9; i++) {
            cardDeck.add(new Card(cardColor));
        }
    }

    /**
     * Für jede Farbe, die im Enum {@link CardColor} definiert ist, werden 9
     * Karten dem Deck hinzugefügt, dann wird das Kartendeck gemischelt, und
     * jeder Karte die Position im Stapel zugeteilt. (1. Karte zuoberst hat
     * Nummer 1)
     */
    private void initCards() {
        for (CardColor cardColor : CardColor.values()) {
            add9CardsOfSpecificColor(cardColor);
        }
        Collections.shuffle(cardDeck);
        for (int i = 0; i < cardDeck.size(); i++) {
            cardDeck.get(i).setNumber(i + 1);
        }
    }

    /**
     * Die oberste Karte vom Stapel wird zurückgegeben. (Die Einträge im Array
     * rutschen an Index 0 nach)
     *
     * @return Oberste Karte.
     */
    public Card drawCard() {
        return cardDeck.remove(0);
    }

    /**
     * Die Farbe von der obersten Karte wird zurückgegeben. Wird genützt um die
     * Karte auf dem GUI anzuzeigen, bevor sie effektiv vom Stapel genommen
     * wird, um auf ein GameField Kartendeck zu verlegen.
     *
     * @return Farbe der obersten Karte des Stapels.
     */
    public CardColor getColorFromTopCard() {
        return cardDeck.get(0).color;
    }

    /**
     * Überprüft, ob Deck leer ist.
     *
     * @return leer oder nicht.
     */
    public boolean isEmpty() {
        return cardDeck.isEmpty();
    }

    /**
     * Überschreibe die toString Funktion, die jedes Objekt hat, damit das
     * Kartendeck in der Konsole angeschaut werden kann. Ist für das Projekt
     * nicht relevant.
     *
     * @return Kartendeck als String. |Farbe, Kartennummer vom ursprünglichen
     * Deck|
     */
    @Override
    public String toString() {
        String string = "CardDeck: ";
        if (cardDeck.isEmpty()) {
            string += "is empty";
        } else {
            for (Card card : cardDeck) {
                string += "\t| " + card.number + " " + card.color.name() + " |";
            }
        }
        string += "\n\n";
        return string;
    }
}